package com.lam.common.pay.utils;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.lam.common.utils.Md5Util;

public class WxSignUtil {

	/**
	   * 生成签名sign
	   * 第一步：非空参数值的参数按照参数名ASCII码从小到大排序，按照键值对的形式。生成字符串StringA
	   * stringA="appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_id=10000100&nonce_str=ibuaiVcKdpRxkhJA";
	   * 第二部：拼接API密钥，这里的秘钥是微信商户平台的秘钥，是自己设置的，不是公众号的秘钥
	   * stringSignTemp="stringA&key=192006250b4c09247ec02edce69f6a2d"
	   * 第三部：MD5加密
	   * sign=MD5(stringSignTemp).toUpperCase()="9A0A8659F005D6984697E2CA0A9CF3B7"
	   *
	   * @param map 不包含空字符串的map
	   * @return
	   */
	  public static String sign(Map<String, Object> map,String key) {
	    //排序
	    String sort=sortParameters(map);
	    //拼接API秘钥
	    sort=sort+"&key="+key;
	    //System.out.println(sort);
	    //MD5加密
	    String sign=Md5Util.md5Encrypt(sort).toUpperCase();
	    return sign;
	  } 
	 
	  /**
	   * 对参数列表进行排序，并拼接key=value&key=value形式
	   * @param map
	   * @return
	   */
	  private static String sortParameters(Map<String, Object> map) {
	    Set<String> keys = map.keySet();
	    List<String> paramsBuf = new ArrayList<String>();
	    for (String k : keys) {
	      paramsBuf.add((k + "=" + getParamString(map, k)));
	    }
	    // 对参数排序
	    Collections.sort(paramsBuf);
	    StringBuilder result = new StringBuilder();
	    int count=paramsBuf.size();
	    for(int i=0;i<count;i++){
	      if(i<(count-1)){
	        result.append(paramsBuf.get(i)).append("&");
	      }else {
	    	  result.append(paramsBuf.get(i));
	      }
	    }
	    return result.toString();
	  }
	  /**
	   * 返回key的值
	   * @param map
	   * @param key
	   * @return
	   */
	  private static String getParamString(Map<String, Object> map, String key) {
	    String buf = "";
	    if (map.get(key) instanceof String[]) {
	      buf = ((String[]) map.get(key))[0];
	    } else {
	      buf = (String) map.get(key);
	    }
	    return buf;
	  }
	  
}
